#include "commonpage.h"
#include "ui_commonpage.h"
#include<QDebug>

//////////////////////////////////////
//我的音乐显示界面//////////////////////
/////////////////////////////////////

CommonPage::CommonPage(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::CommonPage)
{
    ui->setupUi(this);
    ui->pageMusicList->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);//去掉水平滚动条
    //点击播放全部按钮,发送playAll信号,用于通知qqmusic,是哪个对应页面的点击了播放全部按钮,进行相应处理(播放该页面中的所有歌曲)
    connect(ui->playAllBtn,&QPushButton::clicked,this,[=](){
        emit playAll(pageType);
    });
    //双击歌曲对应的Item,发送playMusicByIndex,用于通知qqmusic,是哪个页面的哪个Item(会发送Item对应的索引)被双击要进行播放,进行相应处理(播放被双击Item对应的媒体文件)
    connect(ui->pageMusicList,&QListWidget::doubleClicked,this,[=](const QModelIndex &index){
        emit playMusicByIndex(this,index.row());    //通过QModelIndex类通过的row方法,获取索引并发送
    });
}

CommonPage::~CommonPage()
{
    delete ui;
}

//提供设置CommonPage的文本和图片的方法
void CommonPage::setCommonPageUi(const QString &title, const QString &imagePath)
{
    ui->pageTittle->setText(title);
    ui->musicImageLabel->setPixmap(QPixmap(imagePath));
    ui->musicImageLabel->setScaledContents(true);//图片内容根据QLabel尺寸就行缩放
}

//设置页面类型
void CommonPage::setMuiscPageType(PageType pageType)
{
    this->pageType=pageType;
}

//根据页面类型,把musicList(歌曲列表)保存的音乐添加到对应的页面中(只添加歌曲ID)
void CommonPage::addMusicToMusicPage(MusicList &musiclist)
{
    //清除Page页面存放对应歌曲Id的musicListOfPage
    musicListOfPage.clear();
    //for循环语法糖底层是通过迭代器进行实现的,要提供begin()和end()方法提供遍历的迭代器
    for(auto&music:musiclist)       //遍历musicList(管理所以加载到程序内地音乐文件的列表),对不同页面进行相应的添加
    {
        switch(pageType)
        {
        case LIKE_PAGE:
            if(music.getIsLike())
            {
                musicListOfPage.push_back(music.getMusicId());
            }
                break;
        case LOCAL_PAGE:
            musicListOfPage.push_back(music.getMusicId());
            break;
        case RECENT_PAGE:
            if(music.getIsHistory())
            {
                musicListOfPage.push_back(music.getMusicId());
            }
            break;
        default:
            qDebug()<<"版本尚不支持";
            break;
        }
    }
}

//负责将歌曲信息更新到页面
void CommonPage::reFresh(MusicList &musiclist)
{
    //先清除原先Page页面的音乐列表Item原本的显示,同时会释放与Item绑定的ListItemBox对象,不会造成内存泄漏
    ui->pageMusicList->clear();
    //根据页面类型,把musicList(歌曲列表)保存的音乐添加到对应的页面中(即musicListOfPage中)
    addMusicToMusicPage(musiclist);
    for(auto musicId:musicListOfPage)                   //musicListOfPage中保存对应页面歌曲列表中的歌曲Id
    {
        auto it = musiclist.findMusicById(musicId);       //通过歌曲Id获取歌曲在musicList中的迭代器(it是对应歌曲的迭代器)
        if(it != musiclist.end())
        {
            //将music的歌曲名称,作者,专辑名称更新到界面(即QListWidget中)(即创建一个ListItemBox对象并且和QListWidget的QListWidgetItem对象进行绑定)
            //创建ListItemBox对象
            ListItemBox* item = new ListItemBox(this);
            //为ListItemBox对象设置歌曲名称,作者,专辑名称,是否为我喜欢的属性-->(it是对应歌曲的迭代器)
            item->setMusicName(it->getMusicName());
            item->setMusicSinger(it->getMusicSinger());
            item->setMusicAlbum(it->getMusicAlbum());
            item->setLikeMusic(it->getIsLike());
            //创建QListWidgetItem对象
            QListWidgetItem* listWidgetItem=new QListWidgetItem(ui->pageMusicList);
            qDebug()<<listWidgetItem->sizeHint();//打印listWigetItem创建出来原始的大小
            listWidgetItem->setSizeHint(QSize(item->width(),item->height()));//根据item的宽高设置QListWidgetItem对象的宽高
            qDebug()<<listWidgetItem->sizeHint();
            ui->pageMusicList->setItemWidget(listWidgetItem,item);//item和listWidgetItem进行绑定,并添加到QListWidget中

            //将item发送的setIsLike信号进行拦截,并进行处理
            connect(item,&ListItemBox::setIsLike,this,[=](bool isLike){
                //更新歌曲状态
                //通知qqmusic,不但要修改对应Id歌曲的isLike状态,还要让其中的likePage,localPage,recentPage更新页面歌曲信息
                //发送updataLikeMusic信号,更新qqmusic中对应Id歌曲的isLike状态，以及让其中的likePage,localPage,recentPage更新页面歌曲信息
                //it是歌曲Id对应歌曲的迭代器
                emit updataLikeMusic(isLike,it->getMusicId());  //it是通过歌曲Id获取歌曲在musicList中的迭代器,其指向的是列表中的歌曲对象(Music)
            });
        }
        else continue;
    }
    //触发窗口重绘paintEvent事件,进行显示
    // repaint()会⽴即执⾏paintEvent()，不会等待事件队列的处理
    // update（）将⼀个paintEvent事件添加到事件循环队列中，等待稍后执⾏，即不会⽴即执⾏paintEvent。
    repaint();
}

//把页面对应的歌曲列表添加到当前媒体播放列表中
void CommonPage::addMusicToPlayer(MusicList &musicList, QMediaPlaylist *playList)
{
    //musicList传参过来,根据当前页面类型,根据歌曲对象包含属性将该歌曲是否应该添加到媒体列表中
    for(auto&music:musicList)
    {
        switch(pageType)
        {
        case LIKE_PAGE:         //我喜欢页面,将我喜欢属性为真的音乐,加载到媒体列表中
            if(music.getIsLike())
            {
                playList->addMedia(music.getMusicUrl());
            }
            break;
        case LOCAL_PAGE:        //本地页面,全部歌曲添加到媒体列表中
            playList->addMedia(music.getMusicUrl());
            break;
        case RECENT_PAGE:       //最近播放页面,将历史播放属性为真的音乐,加载到媒体列表中
            if(music.getIsHistory())
            {
                playList->addMedia(music.getMusicUrl());
            }
            break;
        default:
            qDebug()<<"暂不支持";
        }
    }
}

//通过歌曲索引(下标)获取对应歌曲的Id
QString CommonPage::getMusicIdByIndex(int index)
{
    if(index>=musicListOfPage.size())
    {
        qDebug()<<"查无此曲";
        return "";
    }
    return musicListOfPage[index];
}

//设置Page页面的图片
void CommonPage::setImageLabel(QPixmap pixmap)
{
    ui->musicImageLabel->setPixmap(pixmap);
    ui->musicImageLabel->setScaledContents(true);//填充方式设置为自适应填充
}


